跳到主要内容

Maven mvnw 脚本

mvnw 脚本

mvnw 是一个 maven wrapper script,它可以让你在没有安装 maven 或者 maven 版本不兼容的条件下运行 maven 的命令.

注意,需要与 mvnw 软件区分开,spring 项目中的 mvnw 仅仅是个脚本,并非软件。

使用 https://start.spring.io/ 生成 Spring Boot 初始项目时,会自动生成这个 mvnw

├── .mvn
│ └── wrapper
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
├── mvnw
└── mvnw.cmd

mvnw 全名是 Maven Wrapper,它的原理是在 maven-wrapper.properties 文件中记录你要使用的 Maven 版本,当用户执行 mvnw clean 命令时,发现当前用户的 Maven 版本和期望的版本不一致,那么就下载期望的版本,然后用期望的版本来执行 mvn 命令

为项目添加mvnw支持很简单,有两种方式:

方法一:在Pom.Xml中添加Plugin声明:

<plugin>
<groupId>com.rimerosolutions.maven.plugins</groupId>
<artifactId>wrapper-maven-plugin</artifactId>
<version>0.0.4</version>
</plugin>

这样当我们执行 mvn wrapper:wrapper 时,会帮我们生成 mvnw.batmvnwmaven/maven-wrapper.jarmaven/maven-wrapper.properties 这些文件。

然后我们就可以使用 mvnw 代替 mvn 命令执行所有的 maven 命令,比如 mvnw clean package

方法二:直接执行Goal(推荐使用这种)

mvn -N io.takari:maven:wrapper -Dmaven=3.3.3 # 表示我们期望使用的Maven的版本为3.3.3

产生的内容和第一种方式是一样的,只是目录结构不一样,maven-wrapper.jarmaven-wrapper.properties 在 ".mvn/wrapper" 目录下

使用的注意事项

1、由于我们使用了新的 Maven ,如果你的 settings.xml 没有放在当前用户下的 .m2 目录下,那么执行 mvnw 时不会去读取你原来的 settings.xml 文件

2、在 mvnw.bat 中有如下的一段脚本:if exist "%M2_HOME%\bin\mvn.cmd" goto init ,意思是如果找到 mvn.cmd 就执行初始化操作,但是 Maven 早期版本不叫 mvn.cmd,而是叫 mvn.bat,所以会报 "Error: M2_HOME is set to an invalid directory" 错误,改成你本地的 maven 的匹配后缀就好了。

  • maven wrapper 根据配置自动切换 maven 版本。这个看起来很有用,但实际上 maven 版本也是很稳定。很少会出现需要切换 maven 版本的情况

  • 使用 mvnw 命令会在直接当前项目下生成 repository,看起来每一个项目独立了repository,很模块化的样子。但是这样不仅浪费了磁盘空间,且实际上开发中并不关心 repository,idea 会自动有 external librayies 目录提供查看依赖的 jar 包。